iT邦幫忙

2026 iThome 鐵人賽

DAY 1
1

https://ithelp.ithome.com.tw/upload/images/20260915/20168201U5pywWr5P7.png
嗨大家好!我是 Monica,第一天一樣來講講系列文動機與大綱,談談未來的內容規劃。

關於分享主題

再次嘗試鐵人賽,希望能藉此督促自己學習新東西~這次的主題很經典也很常見,應該也是被寫到爛的主題了(?),不過這同時也是我認為自己需要補足的部分。

資料結構與演算法是 Computer Science 的基礎知識,我想把這些基礎打好以後,再進一步深入學習其他 CS 知識,因此想藉由這次鐵人賽,把目前學到的內容整理下來。可能整理出來的內容還是很初階,也可能有些內容是很多人早就知道的,但我覺得也無所謂,就單純想把自己目前學到的東西記錄下來!

除此之外,也希望可以試著把這些看起來比較理論的概念,連結到平常比較常接觸的應用,看看它們在實際的程式或系統中可能會以什麼方式出現。不過這些延伸內容應該只會作為簡單補充,畢竟每個主題繼續挖下去,都可以再寫成另一個完整系列(?),很怕自己又不小心挖太多洞 XD。

這個系列也是為了督促自己看完課程,因為我買了 Udemy 的 《Master the Coding Interview: Data Structures + Algorithms》 線上課程,大概斷斷續續看了兩年都還沒看完🫣,想藉此完成它!

因為 Udemy 課程主要使用 JavaScript,而 JavaScript 也是我目前比較熟悉的語言,因此這系列文章會以 JavaScript 來說明概念並撰寫範例程式。雖然要進一步了解底層,應該還是免不了接觸 C 或 C++,但因為自己目前還不熟悉,所以只會視情況加入一些簡單的 C++ 補充,希望也能藉這次機會慢慢學習 ><。

文章會盡量從各種資料結構與演算法想解決的問題出發,介紹基本概念、JavaScript 實作與複雜度分析,也會試著連結一些平常開發中可能見過的應用。整理過程中如果有不懂的地方,也會搭配 AI 工具來輔助我理解及撰寫文章。

資料結構與演算法是什麼?

很常聽到大家說「資料結構與演算法」,但這到底是什麼呢?在正式進入後面的主題以前,先簡單說明一下這個系列所談的「資料結構」與「演算法」大概是什麼。

演算法(Algorithm)聽起來很複雜,其實可以簡單理解成「一組用來解決特定問題的步驟」。它接收一些輸入資料,按照明確、可執行的步驟進行運算,並在有限的步驟內完成運算,產生預期的輸出。例如,要找出陣列中的最小值,我們可以先將第一個元素當成目前的最小值,再逐一和後面的元素比較;只要遇到更小的值,就更新目前保存的結果。這一連串解決問題的步驟,就是一種演算法。

資料結構(Data Structure)則是程式中組織與保存資料的方式。同一份資料可以用不同形式組織,而資料如何被組織,也會影響我們讀取、搜尋、插入或刪除資料的方式。舉例來說,假設程式中有一組使用者資料:

const users = [
  { id: 1, name: 'Amy' },
  { id: 2, name: 'Ben' },
  { id: 3, name: 'John' },
];

如果使用 Array 保存資料,要根據 id 找到使用者,可以從陣列中逐一尋找:

const targetId = 3;

const user = users.find((item) => item.id === targetId);

但如果程式經常需要根據 id 查找使用者,也可以先將資料整理成以 id 為 key 的 Map:

const usersById = new Map(
  users.map((item) => [item.id, item]),
);

const sameUser = usersById.get(targetId);

兩種方式保存的是相同的使用者資料,但資料的組織方式不同,查找資料的方法也會跟著改變。

不過這並不代表 Map 在所有情況下一定比較好。建立額外的 Map 也需要時間與記憶體,如果資料只會被搜尋一次,事先轉換資料不一定划算。真正要考量的是,程式經常進行什麼操作、資料量有多大,以及我們願意付出哪些額外成本。

這也是資料結構與演算法重要的地方,兩者會互相影響,並且需要根據實際需求進行取捨。

  • 資料結構關心資料如何被安排與保存
  • 演算法關心問題要透過哪些步驟解決

再深入看一層,這兩件事分別對應到電腦的兩種基本資源:

  • 資料結構對應 storage(儲存):記憶體、硬碟。儲存資源是有限的,所以我們會想辦法節省。
  • 演算法對應 computation(計算):CPU、GPU,或雲端上的多台機器。計算同樣是珍貴的資源,要花時間也要花能量。

也就是說,程式設計師在做的事,是想辦法用有限的儲存與計算資源,把想要的結果算出來。而所謂「妥善使用」也不是說有個標準答案,而是要看情境,譬如說,是希望在很短的時間內算完嗎?還是必須在很小的儲存空間裡完成?

對資料結構與演算法這主題來說,重點並不是「哪個資料結構最好」,而是從中學習如何判斷這情境在意什麼,了解不同方法如何輔助我們達到目標。

因此希望自己在學習資料結構與演算法時,除了認識不同資料結構與運算的時間複雜度外,還能進一步思考:

  • 程式目前最常進行的是哪種操作?
  • 現有的資料組織方式有什麼限制?
  • 是否有其他方法可以改善?
  • 改善一項成本時,會不會產生另一項成本?

後續文章會再慢慢展開這些問題,希望自己也能從中逐步培養分析與判斷能力~

主要參考資料

這次系列文會以 Udemy 的 《Master the Coding Interview: Data Structures + Algorithms》 課程內容為主,並搭配 《A Common-Sense Guide to Data Structures and Algorithms》 和台大林軒田教授的 《Data Structures and Algorithms》 課程作為部分補充(假設我有看完的話QQ)。

這裡列出目前預計會涵蓋的主題,實際文章名稱與順序可能會隨著撰寫狀況稍微調整。

主題大綱

資料結構與演算法初探

  • Big O
  • Space Complexity
  • 演算法的正確性

Array、搜尋與索引

  • Array
  • Binary Search
  • Hash Table

Linear Data Structures

  • Linked List
  • Stack
  • Queue

Recursion 與排序演算法

  • Recursion
  • 排序演算法
    • Bubble Sort
    • Selection Sort
    • Insertion Sort
    • Merge Sort
    • Quick Sort

Tree

  • Tree
  • Binary Search Tree
  • Heap 與 Priority Queue
  • Trie

Graph 與 Dynamic Programming

  • Graph
  • BFS
  • DFS
  • Dynamic Programming

總結

  • 系列文總結與完賽心得

如果撰寫過程中發現篇幅需要調整,部分主題可能還會再替換,但整體會先以建立基本的 DSA 知識脈絡為主。

小結

資料結構與演算法是一個很經典、範圍也很大的主題,感覺越查資料,越會發現自己不懂的東西還有很多 ><。

自己目前也不能說真的理解所有內容,C++ 和比較深入、理論的演算法分析對我來說也還很陌生,但希望可以盡量以淺顯的方式整理目前學到的知識,慢慢補足 Computer Science 的相關基礎。

總之,希望這次也可以順利完成 30 天🙏

如果之後文章中有任何敘述不清楚或錯誤的地方,也歡迎提出討論~


下一篇
[Day 02] Big O 是什麼?
系列文
30 天的資料結構與演算法之旅5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言